﻿Imports FairShop
Imports Microsoft.VisualStudio.TestTools.UnitTesting
Imports System
Imports System.Collections.Generic
Imports System.Data
Imports System.Data.OleDb
Imports System.IO
Imports System.Text

<TestClass()> _
Public Class TestImportDal

    Private testContextInstance As TestContext

    '''<summary>
    '''Gets or sets the test context which provides
    '''information about and functionality for the current test run.
    '''</summary>
    Public Property TestContext() As TestContext
        Get
            Return testContextInstance
        End Get
        Set(ByVal value As TestContext)
            testContextInstance = value
        End Set
    End Property

#Region "Additional test attributes"
    '
    ' You can use the following additional attributes as you write your tests:
    '
    ' Use ClassInitialize to run code before running the first test in the class
    <ClassInitialize()> _
    Public Shared Sub MyClassInitialize(ByVal testContext As TestContext)
        AppDomain.CurrentDomain.SetData("APPBASE", Environment.CurrentDirectory)
    End Sub
    '
    ' Use ClassCleanup to run code after all tests in a class have run
    ' <ClassCleanup()> Public Shared Sub MyClassCleanup()
    ' End Sub
    '
    ' Use TestInitialize to run code before running each test
    <TestInitialize()> _
    Public Sub MyTestInitialize()
        PrepareData()
    End Sub
    '
    ' Use TestCleanup to run code after each test has run
    <TestCleanup()> _
    Public Sub MyTestCleanup()
        CleanupData()
    End Sub
    '
#End Region

    Const ID_CATEGORIE_AARSCHOT_WW As Integer = 75
    Const ID_LEVERANCIER_FAIRTRADE_ORIGINAL As Integer = 3

    <TestMethod()> _
     Public Sub ImportTest()
        Dim dal As New ImportDal()
        Dim importDs As ImportDataSet = dal.GetImportDataset(GetTestImportFileNaam())

        Assert.AreEqual(4, importDs._Blad1_.Rows.Count)

        Dim aantallen As ImportDal.Aantallen = dal.ImporteerVanuitExcelBestand(Date.Today.AddDays(1), importDs)

        Assert.AreEqual(3, aantallen.geimporteerdOmToeTeVoegen)
        Assert.AreEqual(1, aantallen.geimporteerdOmKlaarTeZetten)
        Assert.AreEqual(0, aantallen.geimporteerdEnOngewijzigd)
        Assert.AreEqual(0, aantallen.geimporteerdMetFout)
        Assert.AreEqual(1, aantallen.klaargezetInFase1)
        Assert.AreEqual(3, aantallen.toegevoegdInFase1)
        Assert.AreEqual(0, aantallen.bijgewerktInFase2)

        ' Nog eens importeren. Toevoegen zal nu niet meer gebeuren.
        aantallen = dal.ImporteerVanuitExcelBestand(Date.Today.AddDays(1), importDs)

        Assert.AreEqual(0, aantallen.geimporteerdOmToeTeVoegen)
        Assert.AreEqual(1, aantallen.geimporteerdOmKlaarTeZetten)
        Assert.AreEqual(3, aantallen.geimporteerdEnOngewijzigd) ' voorlopig, zolang nieuwe categorieën en leveranciers niet verwerkt worden
        Assert.AreEqual(0, aantallen.geimporteerdMetFout)
        Assert.AreEqual(1, aantallen.klaargezetInFase1)
        Assert.AreEqual(0, aantallen.toegevoegdInFase1)
        Assert.AreEqual(0, aantallen.bijgewerktInFase2)

        ' importfase2 testen met datum die al voorbij is
        aantallen = dal.ImporteerVanuitExcelBestand(Date.Today.AddDays(-1), importDs)

        Assert.AreEqual(0, aantallen.geimporteerdOmToeTeVoegen)
        Assert.AreEqual(1, aantallen.geimporteerdOmKlaarTeZetten)
        Assert.AreEqual(3, aantallen.geimporteerdEnOngewijzigd) ' voorlopig, zolang nieuwe categorieën en leveranciers niet verwerkt worden
        Assert.AreEqual(0, aantallen.geimporteerdMetFout)
        Assert.AreEqual(1, aantallen.klaargezetInFase1)
        Assert.AreEqual(0, aantallen.toegevoegdInFase1)
        Assert.AreEqual(1, aantallen.bijgewerktInFase2)

    End Sub

    <TestMethod()> _
    Public Sub ImportTestFase2()
        Dim dal As New ImportDal()
        Dim importDs As ImportDataSet = dal.GetImportDataset(GetTestImportFileNaam())

        Assert.AreEqual(4, importDs._Blad1_.Rows.Count)

        ' importfase2 testen met datum die al voorbij is
        Dim aantallen As ImportDal.Aantallen = dal.ImporteerVanuitExcelBestand(Date.Today.AddDays(-1), importDs)

        Assert.AreEqual(3, aantallen.geimporteerdOmToeTeVoegen)
        Assert.AreEqual(1, aantallen.geimporteerdOmKlaarTeZetten)
        Assert.AreEqual(0, aantallen.geimporteerdEnOngewijzigd)
        Assert.AreEqual(0, aantallen.geimporteerdMetFout)
        Assert.AreEqual(1, aantallen.klaargezetInFase1)
        Assert.AreEqual(3, aantallen.toegevoegdInFase1)
        Assert.AreEqual(1, aantallen.bijgewerktInFase2)

    End Sub

    <TestMethod()> _
     Public Sub ImportTpsTest()
        Dim dal As New ImportDal()
        Dim importDs As ImportDataSet = dal.GetImportDataset(GetTestImportTpsFileNaam())
        Assert.IsTrue(importDs._Blad1_.Rows.Count > 0)
        ' TODO: vergelijken met echte waarden (vereist wel regelmatig vervangen van test-import.TPS
    End Sub

    '<TestMethod()> _
    ' Public Sub FixDubbeleBarcodesTest()
    '    ImportDal.FixDubbeleBarcodes()
    'End Sub

#Region "Helperfuncties"

    Private Function GetTestImportFileNaam() As String
        Dim diTestDeployFolder As New DirectoryInfo(TestContext.TestDir)
        Dim diSolutionRoot As DirectoryInfo = diTestDeployFolder.Parent.Parent
        Dim diTestFolder As DirectoryInfo = diSolutionRoot.GetDirectories("FairShopTesting")(0)
        Dim diTestDataFolder As DirectoryInfo = diTestFolder.GetDirectories("TestData")(0)
        Dim testImportFileNaam As String = Path.Combine(diTestDataFolder.FullName, "test-import.xls")
        Return testImportFileNaam
    End Function

    Private Function GetTestImportTpsFileNaam() As String
        Dim diTestDeployFolder As New DirectoryInfo(TestContext.TestDir)
        Dim diSolutionRoot As DirectoryInfo = diTestDeployFolder.Parent.Parent
        Dim diTestFolder As DirectoryInfo = diSolutionRoot.GetDirectories("FairShopTesting")(0)
        Dim diTestDataFolder As DirectoryInfo = diTestFolder.GetDirectories("TestData")(0)
        Dim testImportFileNaam As String = Path.Combine(diTestDataFolder.FullName, "test-import.TPS")
        Return testImportFileNaam
    End Function

    Private Sub PrepareData()
        ' data in de artikeldatabank klaarzetten zodat ze altijd dezelfde zijn voor de test
        Dim dsArtikels As New ArtikelsDataSet()
        Dim categorieenAdapter As New ArtikelsDataSetTableAdapters.CategorieenTableAdapter()
        categorieenAdapter.Fill(dsArtikels.Categorieen)
        Dim leveranciersAdapter As New ArtikelsDataSetTableAdapters.LeveranciersTableAdapter()
        leveranciersAdapter.Fill(dsArtikels.Leveranciers)
        Dim leveranciersRow As ArtikelsDataSet.LeveranciersRow = dsArtikels.Leveranciers.FindById(ID_LEVERANCIER_FAIRTRADE_ORIGINAL)
        Dim categorieenRow As ArtikelsDataSet.CategorieenRow = dsArtikels.Categorieen.FindById(ID_CATEGORIE_AARSCHOT_WW)
        ' voeg een artikel toe met een andere prijs dan in de Excel-importtabel
        'dsArtikels.Artikels.AddArtikelsRow("Test bestaand artikel (toe te voegen voor de test)", _
        '    "TEST1", "2000000000001", True, 0, 0, 1D, 0D, 0.8D, 21, _
        '    leveranciersRow, False, False, categorieenRow, 0, 0S, DateTime.Now())
        dsArtikels.Artikels.AddArtikelsRow("Test bestaand artikel (toe te voegen voor de test)", _
            "TEST1", "2000000000001", True, 0, 0, 1D, 0D, 0.8D, 21, _
            leveranciersRow, False, False, categorieenRow, 0, 0S)
        Dim artikelsAdapter As New ArtikelsDataSetTableAdapters.ArtikelsTableAdapter
        artikelsAdapter.Update(dsArtikels)
    End Sub

    Private Sub CleanupData()
        ' verwijder de toegevoegde artikels
        Dim dsArtikels As New ArtikelsDataSet()
        Dim categorieenAdapter As New ArtikelsDataSetTableAdapters.CategorieenTableAdapter()
        categorieenAdapter.Fill(dsArtikels.Categorieen)
        Dim leveranciersAdapter As New ArtikelsDataSetTableAdapters.LeveranciersTableAdapter()
        leveranciersAdapter.Fill(dsArtikels.Leveranciers)
        Dim artikelsAdapter As New ArtikelsDataSetTableAdapters.ArtikelsTableAdapter
        artikelsAdapter.Fill(dsArtikels.Artikels)
        Dim view As New DataView(dsArtikels.Artikels, "Artikelcode LIKE 'TEST*'", "", DataViewRowState.CurrentRows)
        For Each row As DataRowView In view
            Dim idArtikel As Integer = Convert.ToInt32(row.Item("ID"))
            Dim artikel As ArtikelsDataSet.ArtikelsRow = dsArtikels.Artikels.FindById(idArtikel)
            artikel.Delete()
        Next
        Dim view2 As New DataView(dsArtikels.Categorieen, "Categorie LIKE 'NIEUW'", "", DataViewRowState.CurrentRows)
        For Each row As DataRowView In view2
            Dim idCategorie As Integer = Convert.ToInt32(row.Item("ID"))
            Dim categorie As ArtikelsDataSet.CategorieenRow = dsArtikels.Categorieen.FindById(idCategorie)
            categorie.Delete()
        Next
        Dim view3 As New DataView(dsArtikels.Leveranciers, "Naam LIKE 'NIEUW'", "", DataViewRowState.CurrentRows)
        For Each row As DataRowView In view3
            Dim idLeverancier As Integer = Convert.ToInt32(row.Item("ID"))
            Dim leverancier As ArtikelsDataSet.LeveranciersRow = dsArtikels.Leveranciers.FindById(idLeverancier)
            leverancier.Delete()
        Next
        artikelsAdapter.Update(dsArtikels)
    End Sub

#End Region

End Class
